package buy;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * 超市购物系统
 * 
 * @author 马小萌
 * 
 */
public class SuperMarket {

	/**
	 * 虚拟商品仓库
	 */
	List<Goods> ll = new ArrayList<Goods>();

	/**
	 * 待支付费用
	 */

	double pay = 0;

	/**
	 * 展示所有商品信息
	 * 
	 * @return 商品集合
	 * @throws DocumentException
	 */

	public List<Goods> showInfo() throws DocumentException {

		/**
		 * 文档文件
		 */

		Document doc = null;

		/**
		 * 读取xml
		 */

		doc = new SAXReader().read(new File("src\\buy\\products.xml"));

		/**
		 * 获取所有product节点存入集合
		 */

		List<Element> li = doc.selectNodes("/shop/product");

		/**
		 * 遍历这所有的product节点
		 */

		for (Element l : li) {

			/**
			 * 获得product的折扣属性
			 */

			String discount = l.attributeValue("discount");

			/**
			 * 获得product的产地属性
			 */

			String factoryaddr = l.attributeValue("factoryaddr");

			/**
			 * 获取product下的itemno节点中的文本
			 */

			String ito = l.selectSingleNode("itemno").getText();

			/**
			 * 转换成整形
			 */

			int itemno = Integer.parseInt(ito);

			/**
			 * 获取product下的name节点中的文本
			 */

			String name = l.selectSingleNode("name").getText();

			/**
			 * 获取product下的price节点中的文本
			 */

			String pri = l.selectSingleNode("price").getText();

			/**
			 * 转换成浮点型
			 */

			double price = Double.parseDouble(pri);

			/**
			 * 获取product下的stockcount节点中的文本
			 */

			String stc = l.selectSingleNode("stockcount").getText();

			/**
			 * 转换成整形
			 */

			int stockcount = Integer.parseInt(stc);

			/**
			 * 获取product下的unit节点中的文本
			 */

			String unit = l.selectSingleNode("unit").getText();

			/**
			 * 以上作为构造参数新建goods对象存入临时容器List方便遍历读取
			 */

			ll.add(new Goods(discount, itemno, stockcount, unit, name,
					factoryaddr, price));

		}

		/**
		 * 返回一个商品集合
		 */

		return ll;
	}

	// public void addShoppingCart(int ito, int qty, String addr) {

	/**
	 * 加入购物车的方法
	 * 
	 * @param 商品编号
	 * @param 欲购数量
	 */

	public void addShoppingCart(int ito, int qty) {

		/**
		 * 遍历所有的商品
		 */

		for (Goods lll : ll) {

			/**
			 * 找到有对应编号的商品
			 */

			if (lll.getItemno() == ito) {

				/**
				 * 商品数量大于购买数量
				 */

				if (lll.getStockcount() >= qty) {

					// if (addr.equals(lll.getFactoryaddr())) {

					/**
					 * 将该对象的库存数量减少
					 */

					lll.setStockcount(lll.getStockcount() - qty);

					/**
					 * 计算价格
					 */

					pay += qty * lll.getPrice();

					/**
					 * 退出
					 */

					return;

					// }

				} else {

					System.out.println("库存数量不足，请联系管理员！");

					return;
				}

			}
		}
		System.out.println("并未找到该商品");

	}

	/**
	 * 付款方法
	 * 
	 * @return boolean
	 * @throws DocumentException
	 */

	public double pay() throws DocumentException {

		/**
		 * 声明文件类
		 */

		Document doc = null;

		/**
		 * 获取所有xml信息
		 */

		doc = new SAXReader().read(new File("src\\buy\\products.xml"));

		/**
		 * 格式化
		 */

		OutputFormat of = OutputFormat.createPrettyPrint();

		/**
		 * 落实编码
		 */

		of.setEncoding("utf-8");

		/**
		 * 获取所有product节点
		 */

		List<Element> l2 = doc.selectNodes("/shop/product");

		/**
		 * 遍历商品
		 */

		for (Goods g : ll) {

			/**
			 * 遍历所有product下的节点元素
			 */

			for (Element e : l2) {

				/**
				 * 如果商品编号对应
				 */

				if (g.getItemno() == Integer.parseInt(e.selectSingleNode(
						"itemno").getText())) {

					/**
					 * 将改商品的数量更改成该对象的数量（模拟减去库存）
					 */

					e.selectSingleNode("stockcount").setText(
							g.getStockcount() + "");

				}

			}

		}

		try {

			/**
			 * 创建输出流
			 */

			XMLWriter xm = new XMLWriter(new FileOutputStream(
					"src\\buy\\products.xml"), of);

			/**
			 * 写入xml
			 */

			xm.write(doc);

			/**
			 * 关闭输出流
			 */

			xm.close();

		} catch (Exception e1) {

			e1.printStackTrace();

		}

		/**
		 * 输出应付金额
		 */

		return pay;

		// System.out.println("盛惠" + pay + "元。");

	}

	public static void main(String[] args) {

		/**
		 * 输出
		 */

		Scanner sc = new Scanner(System.in);

		/**
		 * 实例化超市购物系统
		 */

		SuperMarket sm = new SuperMarket();

		/**
		 * 声明商品集合
		 */

		List<Goods> li = null;

		try {

			/**
			 * 将sm的show方法返回值存入集合
			 */

			li = sm.showInfo();

		} catch (DocumentException e1) {

			e1.printStackTrace();
		}

		while (true) {

			/**
			 * 提示选项
			 */

			System.out.println("请选择功能：1.显示所有商品信息.2.加入购物车.3.付款.4.离开.");

			switch (sc.nextInt()) {

			case 1:

				for (Goods g : li) {

					System.out.println(g);

				}

				break;

			case 2:

				System.out.println("请输入商品编号");

				int ito = sc.nextInt();

				System.out.println("请输入购买数量");

				int qty = sc.nextInt();

				// System.out.println("请输入产地");
				//
				// String adr = sc.next();
				//
				// sm.addShoppingCart(ito, qty, adr);

				sm.addShoppingCart(ito, qty);

				break;

			case 3:

				try {

					System.out.println("盛惠" + sm.pay() + "元。");

				} catch (DocumentException e) {

					e.printStackTrace();
				}

				break;

			case 4:

				return;
			}
		}
	}
}
